package com.tangruojie.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

/**
 *          ┌──────────────┐
 *          │  Spring 启动 │
 *          └──────┬───────┘
 *                 ↓
 *      扫描配置类 & Bean (@Component/@Configuration)
 *                 ↓
 *    注册你自定义的类到 IOC 容器中（包括你实现/继承的）
 *                 ↓
 * Spring Boot 自动配置判断（@ConditionalOnMissingBean）
 *         ↓                         ↓
 *      你有自定义配置类     →     禁用默认类（如 WebMvcConfig）
 *                 ↓
 *  DispatcherServlet 初始化时读取你的配置类
 *                 ↓
 *     调用你重写的方法（如 addResourceHandlers）
 *                 ↓
 *         实际程序运行用的是你的配置逻辑
 */
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {

    /**
     * DispatcherServlet 请求匹配顺序（核心原理）
     * SpringMVC 的 DispatcherServlet 是这样判断请求该走谁的：
     * 先检查是否有静态资源映射命中（addResourceHandlers）
     * 若无命中 → 查看是否命中 Controller 映射
     * 如果 Controller 返回视图名 → 再走视图解析器
     * 📌 所以：静态资源优先于 Controller + 视图解析器
     */

    /**
     * SpringMVC 中用于手动配置静态资源映射的配置代码，它的作用是：
     * 让 SpringMVC 知道如何处理 /pages/ 开头的静态资源访问请求，并从指定的物理路径中加载资源。
     * SpringMVC 会根据你配置的 addResourceHandlers() 规则：
     * 将请求 /pages/** 映射到 /pages/ 目录下找对应的静态文件
     * 去 classpath 或 webapp 下的 /pages/ 目录中找 books.html
     * 然后作为静态资源返回，不走视图解析器、不走 Controller
     *
     * @param registry
     */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
                /**
                 * 拦截所有以 /pages/ 开头的请求路径（如 /pages/books.html）
                 */
                .addResourceHandler("/pages/**")
                /**
                 * 指定静态资源的物理目录，从这个路径中找文件返回
                 */
                .addResourceLocations("/pages/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
    }

}
